package com.cy.hui_jie_dan.mapper;

import com.cy.hui_jie_dan.popj.entity.Friend;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

/**
* @author mjk
* @description 针对表【friend(好友关系表)】的数据库操作Mapper
* @createDate 2025-05-13 15:18:19
* @Entity com/cy/hui_jie_dan.popj.entity.Friend
*/
@Mapper
public interface FriendMapper {
    /**
     * 根据ID查询好友
     * @param id 好友关系ID
     * @return 好友关系
     */
    @Select("SELECT * FROM friend WHERE id = #{id}")
    Friend selectById(@Param("id") Long id);
    
    /**
     * 插入好友关系
     * @param friend 好友关系
     * @return 影响行数
     */
    @Insert("INSERT INTO friend(user_id, friend_id, remark, status, create_time, update_time) " +
            "VALUES(#{userId}, #{friendId}, #{remark}, #{status}, #{createTime}, #{updateTime})")
    int insert(Friend friend);
    
    /**
     * 更新好友关系
     * @param friend 好友关系
     * @return 影响行数
     */
    @Update("UPDATE friend SET user_id = #{userId}, friend_id = #{friendId}, " +
            "remark = #{remark}, status = #{status}, update_time = #{updateTime} " +
            "WHERE id = #{id}")
    int updateById(Friend friend);
    
    /**
     * 删除好友关系
     * @param id 好友关系ID
     * @return 影响行数
     */
    @Delete("DELETE FROM friend WHERE id = #{id}")
    int deleteById(@Param("id") Long id);
    
    /**
     * 根据用户ID查询好友列表
     * @param userId 用户ID
     * @return 好友列表
     */
    @Select("SELECT * FROM friend WHERE user_id = #{userId}")
    List<Friend> selectByUserId(@Param("userId") Integer userId);
    
    /**
     * 获取好友列表（包含好友信息）
     * @param userId 用户ID
     * @return 好友列表（包含好友信息）
     */
    List<Map<String, Object>> selectFriendListWithUserInfo(@Param("userId") Integer userId);
    
    /**
     * 分页获取好友列表（包含好友信息）
     * @param userId 用户ID
     * @param status 好友状态（可选）
     * @param keyword 搜索关键词（可选）
     * @param orderBy 排序字段（可选）
     * @param orderDirection 排序方向（可选）
     * @param pageSize 每页大小
     * @param offset 偏移量
     * @return 好友列表（包含好友信息）
     */
    List<Map<String, Object>> selectFriendListWithUserInfoPaged(
            @Param("userId") Integer userId,
            @Param("status") Integer status,
            @Param("keyword") String keyword,
            @Param("orderBy") String orderBy,
            @Param("orderDirection") String orderDirection,
            @Param("pageSize") Integer pageSize,
            @Param("offset") Integer offset);
    
    /**
     * 获取好友总数
     * @param userId 用户ID
     * @param status 好友状态（可选）
     * @param keyword 搜索关键词（可选）
     * @return 好友总数
     */
    Integer countFriendsByUserId(
            @Param("userId") Integer userId,
            @Param("status") Integer status,
            @Param("keyword") String keyword);

    /**
     * 检查是否是好友关系
     * @param userId1 用户1 ID
     * @param userId2 用户2 ID
     * @return 是否是好友
     */
    Integer checkFriendship(@Param("userId1") Integer userId1, @Param("userId2") Integer userId2);
    
    /**
     * 批量检查好友关系
     * @param userId 当前用户ID
     * @param friendIds 待检查的好友ID列表
     * @return 好友关系映射
     */
    List<Map<String, Object>> batchCheckFriendship(
            @Param("userId") Integer userId,
            @Param("friendIds") List<Integer> friendIds);

    /**
     * 删除好友关系
     * @param userId1 用户1 ID
     * @param userId2 用户2 ID
     * @return 影响行数
     */
    int deleteFriendship(@Param("userId1") Integer userId1, @Param("userId2") Integer userId2);

    /**
     * 更新好友备注
     * @param userId 用户ID
     * @param friendId 好友ID
     * @param remark 备注
     * @return 影响行数
     */
    int updateFriendRemark(@Param("userId") Integer userId, @Param("friendId") Integer friendId, @Param("remark") String remark);
    
    /**
     * 更新好友状态
     * @param userId 用户ID
     * @param friendId 好友ID
     * @param status 状态
     * @return 影响行数
     */
    int updateFriendStatus(@Param("userId") Integer userId, @Param("friendId") Integer friendId, @Param("status") Integer status);
    
    /**
     * 批量插入好友关系
     * @param friends 好友关系列表
     * @return 影响行数
     */
    int batchInsertFriends(@Param("friends") List<Friend> friends);
}




